use std::borrow::Cow;
//定义变量可以使用let关键字
fn variable() {
    //定义变量可以使用let关键字
    let x = 5;
    println!("The value of x is: {}", x);
    //定义常量可以使用const关键字
    let mut  y = 10;
    y = y - 5;
    println!("The value of y is: {}", y);
    //定义变量可以使用mut关键字，表示可变
    let mut z = 30;
    z = 40;
    z = z + 60;
    println!("The value of z is: {}", z);
}
//字符串变量定义
fn variable_string() {
    let mut s = String::new();
    s.push_str("start");
    s.push_str(", finish!");
    println!("The value of s is: {}", s);

    //使用to_string方法将&str转换为String类型，从而实现字符串的动态修改：
    let mut s1 = "Hello".to_string();
    s1.push_str(", Update!");
    println!("The value of s1 is: {}", s1);

    let  s2 = "hello s2";
    let mut s3 = "hello s3".to_string();
    s3.push_str(",not !");
    println!("The value of s2+s3 is: {}",s3);
    //使用len方法获取字符串长度
    println!("The value of length is: {}",s3.len());
    println!("The value of count is: {}",s3.chars().count());

    //使用replace方法替换字符串中的子字符串
    let original_string = "Hello, World!";
    let sub_string = "World";
    let new_sub_string = "Universe";
    let replaced_string = original_string.replace(sub_string, new_sub_string);
    println!("Original string: {}", original_string);
    println!("Replaced string: {}", replaced_string);

    /** 使用 chars() 和 char_indices() 方法：
     * 你可以使用 chars() 方法遍历字符串中的字符，
     * 或者使用 char_indices() 方法同时获取字符及其字节索引。
     */
    let mut string = String::from("hello world");
    let mut chars = string.chars();
    let mut indices = string.char_indices();

    // 获取前几个字符
    let new_string: String = chars.take(5).collect();
    println!("获取前几个字符 New string: {}", new_string);
    // 获取特定索引之后的字符串
    let start_index = string.find('w').unwrap_or(string.len());
    let new_string = string[start_index..].to_string();
    println!("New string: {}", new_string);

    /**
    使用 split_at() 方法： 如果你想要在指定的字节索引处截取字符串，
    你可以使用 split_at() 方法。但是，你需要确保这个索引不会落在某个字符的中间。
    */
    let string = String::from("hello world");
    let (first, second) = string.split_at(5); // 分割点在 ' ' 空格处
    println!("First part: {}", first);

    /**
    *使用 Cow<str>（Copy-on-Write）： 如果你需要在字符串的某些操作中避免不必要的拷贝，你可以使用 Cow<str> 类型。Cow 是一个枚举，它可以表示对数据的借用或者拥有数据。
    rust
     */
    use std::borrow::Cow;

    let string = String::from("hello world");
    let cow: Cow<str> = Cow::Borrowed(&string[0..5]); // 借用前5个字符
    println!("{}", cow);
    // //使用第三方库： 有些第三方库提供了更方便的字符串截取功能，例如 utf8_slice 库，它可以安全地处理 UTF-8 字符串的切片。
    // let string = String::from("你好，世界");
    // let sliced = utf8_slice(&string, 3, 6); // 截取第4个字符到第7个字符
    // println!("{}", sliced);
}
fn main() {
    //定义变量可以使用let关键字
    println!("Hello, world!");
    variable();
    variable_string();
}
